From a3d056db903992f888350720f5b3aa665f3da791 Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Tue, 1 Sep 2015 10:14:32 -0700 Subject: [PATCH] Only document platform-relevant dependencies The recent change in #1939 ended up accidentally pulling in irrelevant platform-specific dependencies into a normal `cargo doc`, causing those builds to fail. This change tweaks the logic for calculating documentation dependencies to account for filtering based on the relevant platform. --- src/cargo/ops/cargo_rustc/context.rs | 35 +++++++++++++++++----------- tests/test_cargo_doc.rs | 24 +++++++++++++++++++ 2 files changed, 45 insertions(+), 14 deletions(-) diff --git a/src/cargo/ops/cargo_rustc/context.rs b/src/cargo/ops/cargo_rustc/context.rs index d9565294d..44839f7c9 100644 --- a/src/cargo/ops/cargo_rustc/context.rs +++ b/src/cargo/ops/cargo_rustc/context.rs @@ -7,7 +7,7 @@ use std::sync::Arc; use regex::Regex; use core::{SourceMap, Package, PackageId, PackageSet, Resolve, Target, Profile}; -use core::{TargetKind, LibKind, Profiles, Metadata}; +use core::{TargetKind, LibKind, Profiles, Metadata, Dependency}; use util::{self, CargoResult, ChainError, internal, Config, profile}; use util::human; @@ -343,7 +343,7 @@ impl<'a, 'cfg> Context<'a, 'cfg> { profile: &Profile) -> Vec<(&'a Package, &'a Target, &'a Profile)> { if profile.doc { - return self.doc_deps(pkg, target); + return self.doc_deps(pkg, target, kind); } let deps = match self.resolve.deps(pkg.package_id()) { None => return Vec::new(), @@ -367,15 +367,7 @@ impl<'a, 'cfg> Context<'a, 'cfg> { // If this dependency is only available for certain platforms, // make sure we're only enabling it for that platform. - let is_platform_same = match (d.only_for_platform(), kind) { - (Some(ref platform), Kind::Host) => { - *platform == self.config.rustc_info().host - }, - (Some(ref platform), Kind::Target) => { - *platform == self.target_triple - }, - (None, _) => true - }; + let is_platform_same = self.dep_platform_activated(d, kind); // If the dependency is optional, then we're only activating it // if the corresponding feature was activated @@ -418,16 +410,17 @@ impl<'a, 'cfg> Context<'a, 'cfg> { } /// Returns the dependencies necessary to document a package - fn doc_deps(&self, pkg: &Package, target: &Target) + fn doc_deps(&self, pkg: &Package, target: &Target, kind: Kind) -> Vec<(&'a Package, &'a Target, &'a Profile)> { let pkg = self.get_package(pkg.package_id()); let deps = self.resolve.deps(pkg.package_id()).into_iter(); let deps = deps.flat_map(|a| a).map(|id| { self.get_package(id) }).filter(|dep| { - pkg.dependencies().iter().find(|d| { + let dep = pkg.dependencies().iter().find(|d| { d.name() == dep.name() - }).unwrap().is_transitive() + }).unwrap(); + dep.is_transitive() && self.dep_platform_activated(dep, kind) }).filter_map(|dep| { dep.targets().iter().find(|t| t.is_lib()).map(|t| (dep, t)) }); @@ -457,6 +450,20 @@ impl<'a, 'cfg> Context<'a, 'cfg> { return ret } + fn dep_platform_activated(&self, dep: &Dependency, kind: Kind) -> bool { + // If this dependency is only available for certain platforms, + // make sure we're only enabling it for that platform. + match (dep.only_for_platform(), kind) { + (Some(ref platform), Kind::Host) => { + *platform == self.config.rustc_info().host + }, + (Some(ref platform), Kind::Target) => { + *platform == self.target_triple + }, + (None, _) => true + } + } + /// Gets a package for the given package id. pub fn get_package(&self, id: &PackageId) -> &'a Package { self.package_set.iter() diff --git a/tests/test_cargo_doc.rs b/tests/test_cargo_doc.rs index 7464e3774..5d6d8a90e 100644 --- a/tests/test_cargo_doc.rs +++ b/tests/test_cargo_doc.rs @@ -289,3 +289,27 @@ test!(doc_target { assert_that(&p.root().join(&format!("target/{}/doc", TARGET)), existing_dir()); assert_that(&p.root().join(&format!("target/{}/doc/foo/index.html", TARGET)), existing_file()); }); + +test!(target_specific_not_documented { + let p = project("foo") + .file("Cargo.toml", r#" + [package] + name = "foo" + version = "0.0.1" + authors = [] + + [target.foo.dependencies] + a = { path = "a" } + "#) + .file("src/lib.rs", "") + .file("a/Cargo.toml", r#" + [package] + name = "a" + version = "0.0.1" + authors = [] + "#) + .file("a/src/lib.rs", "not rust"); + + assert_that(p.cargo_process("doc"), + execs().with_status(0)); +}); -- 2.30.2